package cl.tinet.trainee.proyecto.ejb;

import java.util.ArrayList;
import java.util.Date;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import cl.tinet.trainee.proyecto.dao.InterfazReservaDAO;
import cl.tinet.trainee.proyecto.dao.ReservaDAO;
import cl.tinet.trainee.proyecto.excepciones.DatosNulosException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoDuplicadoException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoNoEncontradoException;
import cl.tinet.trainee.proyecto.modelo.Reserva;

/**
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBean.
 * 
 * @author Jose Palma.
 * 
 */
@Stateless(mappedName = "reservaBean", name = "reservaBean")
public class ReservaBeanImpl implements InterfazReservaBean {
    /**
      * 
      */
    private static final Logger LOG = Logger.getLogger(ReservaBeanImpl.class);
    /**
     * Manejador de entidad y contexto de persistencia de los datos.
     */
    @PersistenceContext(unitName = "dsPalma")
    private EntityManager em;
    /**
     * Capa dao.
     */
    private InterfazReservaDAO dao;

    /**
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     */
    @PostConstruct
    public void init() {
        dao = new ReservaDAO(em);
    }

    /**
     * {@inheritDoc}
     */
    public void agregar(Reserva nuevaReserva) throws ObjetoDuplicadoException {
        Reserva reserva = null;
        try {
            reserva = buscar(nuevaReserva);
        } catch (ObjetoNoEncontradoException e) {
            LOG.debug("USUARIO NO EXISTE" + nuevaReserva.getIdReserva());
        }
        if (reserva != null) {
            throw new ObjetoDuplicadoException(
                    ObjetoDuplicadoException.OBJETO_DUPLICADO);
        } else {
            LOG.debug("Agregar reserva: " + nuevaReserva);
            dao.agregar(nuevaReserva);
            LOG.debug("Agregar reserva - Agregado");
        }
    }

    /**
     * {@inheritDoc}
     */
    public void borrar(Reserva reservaAEliminar)
            throws ObjetoNoEncontradoException {
        Reserva reservaEncontrado = buscar(reservaAEliminar);
        if (reservaEncontrado != null) {
            dao.borrar(reservaEncontrado);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void actualizar(Reserva reservaAActualizar)
            throws ObjetoNoEncontradoException {
        Reserva reservaEncontrado = buscar(reservaAActualizar);
        if (reservaEncontrado != null) {
            reservaEncontrado.copiar(reservaAActualizar);
            dao.actualizar(reservaEncontrado);
        }
    }

    /**
     * {@inheritDoc}
     */
    public Reserva buscar(Reserva reservaABuscar)
            throws ObjetoNoEncontradoException {
        Reserva reservaEncontrado = null;
        try {
            reservaEncontrado = dao.buscar(reservaABuscar);
        } catch (DatosNulosException e) {
            LOG.debug("LA CONSULTA NO OBTUVO DATOS: "
                    + reservaABuscar.getIdReserva());
            throw new ObjetoNoEncontradoException(
                    ObjetoNoEncontradoException.OBJETO_NO_ENCONTRADO);

        }
        return (reservaEncontrado);
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Reserva> listar() {
        return dao.listar();
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Reserva> buscarPorFecha(Date fechaABuscar) {
        return dao.buscarPorFecha(fechaABuscar);
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Reserva> buscarPorSala(int idsala) {
        return dao.buscarPorSala(idsala);
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Reserva> buscarPorUsuario(int idusuario) {
        return dao.buscarPorUsuario(idusuario);
    }

}
